/**头文件**/
#include <SPI.h>
#include <Wire.h>
#include <dht11.h>                    //温度的头文件 
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char *ssid = "joy";//WIFI名
const char *password = "11111111";//密码

char temp[900]; //网页显示内容 
 
ESP8266WebServer server ( 80 );//建立服务器对象，设置监听端口号为80（网页默认端口号）

 //温度传感器加载 
dht11 DHT11;

#define DHT11_PIN 2    //dht11引脚 D4
#define led 4     //led引脚 D2

int temperature=0;//存放温度的变量
int humidity=0;//存放湿度的变量
 
void handleRoot() {//根目录发送主页
   
//网页内容如下
  snprintf (temp, 900,

"<html>\
  <head>\
    <meta http-equiv='refresh' content='5'/>\
    <title>ESP8266 Demo</title>\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <h1>Hello from ESP8266!</h1>\
    <p>temperature : %02d</p>\
    <p>humidity : %02d</p>\
     <p>On_LED</p>\
    <a href=./pin?light=On><input type=button value=On></a>\
     <p>OFF_LED</p>\
    <a href=./pin?light=Off><input type=button value=Off></a>\
  </body>\
 </html>\
 ",
   temperature,humidity
  );
  /**code：状态代码   如：200， 404， 500等  
  type：网页类型   如：text/html，image/svg+xml等
  message：要发给客户端的内容
  server.send ( code, type, message );   **/
  server.send ( 200, "text/html", temp );
   
}

void handleNotFound() {//访问地址不存在返回404
  
  //message:要发给客户端的内容
  String message = "File Not Found\n\n"; //字符串内容
  message += "URI: "; //字符串内容
  message += server.uri();//获取uri
  message += "\nMethod: ";  //字符串内容
  message += ( server.method() == HTTP_GET ) ? "GET" : "POST";//判断是get方法，还是post方法
  message += "\nArguments: "; //字符串内容
  message += server.args(); //获取返回参数的内容
  message += "\n"; //换行

//获取返回参数的名字、内容
  for ( uint8_t i = 0; i < server.args(); i++ ) {  
    message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n";
  }

  server.send ( 404, "text/plain", message );   //返回404错误信息给客户端
  
}

/**点击按钮后的连接函数**/
void pin(){
  if(server.arg("light")=="On"){  // 如果获得的light参数值等于on  
  digitalWrite(led,HIGH); //拉高led的引脚，即可点亮led
  server.send ( 200, "text/html", temp );  //返回temp信息给客户端
}
if(server.arg("light")=="Off"){  // 如果获得的light参数值等于off 
  digitalWrite(led,LOW);  //拉低led的引脚，即可熄灭led
server.send ( 200, "text/html", temp ); //返回temp信息给客户端
}
}

 //在这里加入初始化相关代码，只运行一次:
void setup ( void ) {
 
  Serial.begin ( 115200 );  //初始化串口通信，并将波特率设置为115200
  WiFi.mode ( WIFI_STA ); //WIFI设为STA模式
  WiFi.begin ( ssid, password ); //连接WIFI
  Serial.println ( "" ); //串口打印
  
pinMode(DHT11_PIN,OUTPUT);    //dht11引脚设置为输出模式
pinMode(led,OUTPUT);    //led引脚设置为输出模式

  // Wait for connection
  while ( WiFi.status() != WL_CONNECTED ) { //WIFI的连接状态
    delay ( 500 );
    Serial.print ( "." ); //如果没有连通向串口发送.....
  }

  Serial.println ( "" );  //串口打印
  Serial.print ( "Connected to " ); //串口打印Connected to
  Serial.println ( ssid ); //串口打印WIFI名
  Serial.print ( "IP address: " ); //串口打印IP address: 
  Serial.println ( WiFi.localIP() ); //串口打印本地IP地址

  if ( MDNS.begin ( "esp8266" ) ) {  //MDNS域名服务，begin方法创建我们将使用的Web地址，并将其命名为“esp8266”。
    Serial.println ( "MDNS responder started" );  //如果已经存在，串口打印MDNS responder started提示信息
  }

  server.on ( "/", handleRoot );//注册访问根目录回调函数

  server.on("/pin", HTTP_GET ,pin);  //注册按钮点击的事件
   
  server.onNotFound ( handleNotFound );//注册无地址访问函数
  server.begin();//启动服务器
  Serial.println ( "HTTP server started" ); //串口打印HTTP server started
}

// 在这里加入主要程序代码，重复执行:
void loop ( void ) {
  
  /**串口温度**/
int chk1 = DHT11.read(DHT11_PIN);   //将读取到的数据赋给chk

 temperature=DHT11.temperature;//将温湿度值赋值给变量temperature
  humidity=DHT11.humidity;//将湿度值赋值给变量humidity
  /**串口打印温湿度数据**/
  Serial.print("Temperature: ");
  Serial.println(temperature);
  Serial.print("humidity ");
  Serial.println(humidity);
  delay(100); //延时100ms
  
  server.handleClient();//监听客户端请求，并处理

}

 
